<?php
/**
 * Класс очереди RSS закачек. Он используется рсс ботом при скачивании и при формировании очереди.
 * Описание полей таблиц лежит в etc/type.d/crssfeed_list.php и etc/type.d/crssdownloads.php 
 *  
 * @author Alexander Sibiryakov
 */
class Model_RssDLQueue extends RL_Model2 {
	
	/**
	 * Идентификатор сессии, используется классом при сохранении.
	 * Нужен для того чтобы можно было получить все изменения в очереди в рамках сессии 
	 */
	private $ssid;  
	
	public function initDLSession() {
		$this->ssid = uniqid();
	}
	
	/**
	 * Поставить фид $feed_oid  в очередь для закачки
	 * 
	 * @author Alexander Sibiryakov
	 */
	public function addDL($feed_oid) {
		$data = array(
			"rssfeed_list_oid"=>$feed_oid,
			"try_count"=>0,
			"size_kb"=>0,
			"last_try_ts"=>"0000-00-00 00:00:00",
			"is_succ_dl"=>0,
			"dl_session_id"=>$this->ssid,
			"is_fresh"=>1
		);
		$dl = $this->store->create('frssdownloads', $data );
		
		if ($dl->save() && $dl->inSense("rssdownloads")) return true; else return false;
	}
	
	/**
	 * Вернет объект RssDownload последней удачной попытки скачать фид или false если нет такой попытки
	 * 
	 * @return mixed
	 */
	public function getLastDLByFeed($feed_oid) {
		$db_pr = $this->db->db_prefix;
		$sql = "SELECT `{$db_pr}objects`.*, fl.url AS url FROM `{$db_pr}class_rssdownloads` 
		INNER JOIN `{$db_pr}objects` ON `{$db_pr}objects`.`oid` = `{$db_pr}class_rssdownloads`.`oid`
		INNER JOIN `{$db_pr}class_rssfeed_list` fl ON fl.`oid` = `{$db_pr}class_rssdownloads`.`rssfeed_list_oid`
WHERE {$db_pr}class_rssdownloads.`rssfeed_list_oid` = ".$feed_oid." AND `{$db_pr}class_rssdownloads`.`is_succ_dl` = 1
ORDER BY {$db_pr}class_rssdownloads.`last_try_ts` DESC LIMIT 1";
		
		$rs2 = $this->store->findSQL( $sql );
		if ($rs2) $obj = $rs2->next();
		if ($obj)  {
			$row = $rs2->rs->current();
			return new RssDownload($obj, $row['url'], $feed_oid);
		}
		return false;
	}
	
	/**
	 * Проверит, есть ли фид в очереди.
	 * 
	 * @return boolean
	 * @param $feed_oid
	 */
	public function isDLToFeed($feed_oid) {
		$db_pr = $this->db->db_prefix;
		$sql = "SELECT `{$db_pr}objects`.* FROM `{$db_pr}class_rssdownloads` 
		INNER JOIN `{$db_pr}objects` ON `{$db_pr}objects`.`oid` = `{$db_pr}class_rssdownloads`.`oid`
		WHERE {$db_pr}class_rssdownloads.`rssfeed_list_oid` = ".$feed_oid." AND 
		(`{$db_pr}class_rssdownloads`.`is_succ_dl` = 0 OR `{$db_pr}class_rssdownloads`.`is_fresh` = 1)
		ORDER BY {$db_pr}class_rssdownloads.`last_try_ts` DESC
		LIMIT 1";
		
		$rs2 = $this->store->findSQL( $sql );
		if ($rs2) $obj = $rs2->next();
		if ($obj)  {
			return true;
		}
		
		return false;
	}

	/**
	* Вернет массив с объектами RssDownload, которые содержаться в очереди
	* 
	* @param none
	* @return RssDownload[]
	*/
	public function getQueue() {
		$db_pr = $this->db->db_prefix;
		
		// взять все закачки помеченные как "свежие" и не помеченные как "удачно скачанные"
		$sql = "
		SELECT `{$db_pr}objects`.*, 
		fl.url AS url,
		fl.oid AS feed_oid
		FROM `{$db_pr}class_rssdownloads` 
		INNER JOIN `{$db_pr}objects` ON `{$db_pr}objects`.`oid` = `{$db_pr}class_rssdownloads`.`oid`
		INNER JOIN `{$db_pr}class_rssfeed_list` fl ON fl.`oid` = `{$db_pr}class_rssdownloads`.`rssfeed_list_oid`
		WHERE `{$db_pr}class_rssdownloads`.`is_fresh` = 1 OR `{$db_pr}class_rssdownloads`.`is_succ_dl` = 0";
		
		$rs2 = $this->store->findSQL( $sql );
		if (!$rs2) return array();
		$objs = array();
		while ($obj = $rs2->next()) {
			$row = $rs2->rs->current();
			$objs[] = new RssDownload($obj, $row['url'], $row['feed_oid']);
		}
		return $objs;
	}
}
?>
